package com.cskaoyan.javase.oop2._1extends._1relation;

/**
 * @description: 继承中父子类的关系
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 从从属关系上,继承中父子类具有"is-a"关系,换句话说,子类"is-a"父类,子类可以看成是一个父类(子类就是一个父类)
 * 解释:
 *      1.代码角度解释,在正常情况下,创建谁的对象,就用谁的引用接收
 *          但是在具有父子类关系的两个类中,存在用父类引用接收子类对象的情况
 *          在这种情况下,子类对象被当成了父类去使用了
 *          这说明子类对象是可以当成父类对象去使用的
 *          子类可以看成就是一个父类,也就是"is-a"关系
 *      2.从数据类型的定义角度,
 *          数据类型: 一组数据 + 基于数据的操作
 *          引用数据类型: 成员变量的集合 + 成员方法的集合
 *          子类通过继承父类,得到了父类的所有成员,于是子类就具有了父类的功能
 *          子类可以当做父类去使用,也就是子类"is-a"父类
 *
 *      3.直观角度,说白了:
 *          Student就是Person
 *          Teacher就是Person
 *          Cat也是Animal
 *          Dog也是Animal
 *          ..
 *          很明显它们都具有"is-a"关系
 *          注: 实际开发中,要根据具体的业务场景来设计父子类(根据需求文档)
 *
 * 以上,子类"is-a"关系
 * 反过来,父类和子类有什么关系吗?父类能当子类用吗?
 * 父类和子类没有直接关系,子类往往比父类要强大,父类不能当成子类使用~
 *
 * 扩展:
 *      引用数据类型的类型转换
 *
 * 1.引用数据类型要想发生类型转换,需要的前提是什么?
 *      引用数据类型的类型转换必须发生在具有父子关系的两个类之间
 *      如果是没有继承关系的两个类,强制它类型转换,会编译报错
 *
 * 2.引用数据类型的类型转换,转换的是什么?
 *      转换的是引用的数据类型,对象的类型是不可能转换的
 *
 * 3.引用数据类型的类型转换的分类:
 *      a.自动类型转换
 *      b.强制类型转换
 *
 * 4.引用数据类型的自动类型转换: 无需程序员写额外代码,编译器自动完成类型转换
 *      a.条件:
 *          把子类的引用转换成父类的引用,这个过程不需要写额外代码,自动转换
 *      b,从继承的角度上来讲,子类引用转换成父类引用,在方向上是从下往上的
 *          所以引用数据类型的自动类型转换也称之为"向上转型"
 *
 * 5.引用数据类型的强制类型转换: 需要程序员写额外代码强制完成类型转换
 *      a.条件:
 *          把父类的引用转换成子类的引用,这个过程需要写额外代码,强制转换
 *          相当于把父类对象当子类对象去使用,这在绝大多数情况下是不可能的
 *          所以引用数据类型的强制类型转换想要完成,条件很苛刻
 *      b.强转额外代码的语法:
 *          子类的引用 = (子类的类名)父类引用
 *      c.从继承的角度上来讲,父类引用转换成子类引用,在方向上是从上往下的
 *          所以引用数据类型的强制类型转换也称之为"向下转型"
 *
 */
public class Demo {
    public static void main(String[] args) {

       /*
        //如果是没有继承关系的两个类,强制它类型转换,会编译报错
        String s = "hell";
        Demo d = (Demo) s;*/


        Father f = new Father();
        Son s = new Son();
        //把子类引用赋值给父类引用
        f = s;
        //double a = 10;


        //父类引用指向子类对象
        Father fs = new Son();
    }
}

class Father {
}

class Son extends Father {
}
